<?php
/**
 * CK框架 过滤器类
 * @author wujibing<283109896@qq.com>
 * @version   3.0
 * @category   CkFrameWork
 * @package  CkFrameWork
 * @subpackage lib
 */
class filter
{

	/**
	 * 判断年份
	 * @access public
	 * @static
	 * @param int $value
	 * @return boolean
	 */
	public static function year ($value)
	{
		$value = (int) $value;
		return $value > 1899 && $value < 2011;
	}

	/**
	 * 判断一个值是否存在
	 * @access public
	 * @static
	 * @param $value
	 * @return boolean
	 */
	public static function checkNull ($value)
	{
		return $value ? true : false;
	}
	/**
	 * 判断一个值是否为EMPTY
	 * @access public
	 * @static
	 * @param mixed $value
	 */
	public static function isEmpty($value)
	{
		return !empty($value);
	}
	/**
	 * 判断月份
	 * @access public
	 * @static
	 * @param int $value
	 * @return boolean
	 */
	public static function month ($value)
	{
		$value = (int) $value;
		return $value > 0 && $value < 13;
	}

	/**
	 * 判断否点数是否大于/等于0
	 * @access public
	 * @static
	 * @param float $value 判断的值
	 * @param boolean $isZroe 默认为false 为判断数据必须大于0 为true的时候判断大于和等于0
	 * @return boolean
	 */
	public static function checkFloat (&$value, $isZroe = false)
	{
		$value = (float) $value;
		return $isZroe ? $value >= 0 : $value > 0;
	}

	/**
	 * 判断日期
	 * @access public
	 * @static
	 * @param int $value
	 * @return boolean
	 */
	public static function day (&$value)
	{
		$value = (int) $value;
		return $value > 0 && $value < 31;
	}

	/**
	 * 判断整数是否大于另外一个数值
	 * @access public
	 * @static
	 * @param int $value 需要比较的数值
	 * @param int $isZero 需要大于的数值  默认为0
	 * @return boolean
	 */
	public static function int (&$value, $isZero = 0)
	{
		$value = (int) $value;
		return $value > $isZero ? true : false;
	}

	/**
	 * 检查是否为上传文件
	 * @access public
	 * @static
	 * @param string $uploadFileName 检查的$_FILES[]文件索引名
	 * @return boolean
	 */
	public static function isUploadFile ($uploadFileName)
	{
		if (!isset($_FILES[$uploadFileName]) || empty($_FILES[$uploadFileName]))
		{
			return false;
		}
		$fileSize = (int) $_FILES[$uploadFileName]['size'];
		$tmpFile = $_FILES[$uploadFileName]['tmp_name'];
		if ($fileSize < 0 || $_FILES[$uploadFileName]['error'] > 0 || empty($tmpFile))
		{
			return false;
		}
		if (! is_uploaded_file($tmpFile))
		{
			return false;
		}
		return true;
	}

	/**
	 * 检查一个数组。取除该数组里面的整形数据组成一个新的数组。
	 * @access public
	 * @static
	 * <code>
	 * <?php
	 * $array = array(1,2,3,4,5,6,'a');
	 * if(!filter::($array,2))
	 * {
	 * echo '过滤后数组为空';
	 * } else
	 * {
	 * print($array);//$array等于 array(3,4,5,6)
	 * }
	 * ?>
	 * </code>
	 * @param array $arr 数组
	 * @param int $minInt 默认为0 循环的数组值必须大于该值
	 * @return boolean
	 */
	public static function checkIntArr (&$arr, $minInt = 0)
	{
		$minInt = (int) $minInt;
		if ($arr && is_array($arr))
		{
			$newArr = array();
			foreach ($arr as $value)
			{
				$value = (int) $value;
				if ($value > $minInt)
				{
					$newArr[] = $value;
				}
			}
			if ($newArr)
			{
				$arr = $newArr;
				return true;
			}
		}
		return false;
	}

	/**
	 * 判断一个用户名是否为合法
	 * @access public
	 * @static
	 * @param string $value 检查的用户名
	 * @param array $m array(minStrLen,maxStrLen)
	 * @link filter::stringLen
	 * @return boolean
	 */
	public static function userName ($value, $m)
	{
		if (self::stringLen($value, $m) === false)
		{
			return false;
		} elseif (! preg_match('/^[a-zA-Z0-9_ ]\w{3,}$/i', $value))
		{
			return false;
		}
		return preg_match('/[\\\<>\?\#\$\*\&;\/\[\]\{\}=\(\)\.\^%,]/', $value) ? false : true;
	}

	/**
	 * 判断字符串是否全部为英文 以及字符串的长度
	 * @access public
	 * @static
	 * @param string $value 字符串
	 * @param unknown_type $m array(minStrLen,maxStrLen)
	 * @link filter::stringLen
	 * @return boolean
	 */
	public static function english ($value, $m)
	{
		if (! preg_match('/^[A-Za-z]+$/', $value))
		{
			return false;
		}
		return self::stringLen($value, $m);
	}

	/**
	 * 判断字符串是否全部为中文 以及字符串的长度
	 * @access public
	 * @static
	 * @param string $value 字符串
	 * @param unknown_type $m array(minStrLen,maxStrLen)
	 * @link filter::stringLen
	 * @return boolean
	 */
	public static function chinese ($value, $m)
	{
		if (! preg_match('/^[\x0391-\xFFE5]+$/', $value))
		{
			return false;
		}
		return self::stringLen($value, $m);
	}

	/**
	 * 判断一个字符串是否为URL连接
	 * @access public
	 * @static
	 * @todo 该方法只实现了http网址判断。对于https,ftp等连接未判断
	 * @param string $value
	 * @return boolean
	 */
	public static function url ($value)
	{
		return self::pregCheck(
		'^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$', 
		$value);
	}

	/**
	 * 判断一个字符窜是否为email地址
	 * @access public
	 * @static
	 * @param string $value
	 * @return boolean
	 */
	public static function email ($value)
	{
		return self::pregCheck('^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$', $value);
	}

	/**
	 * 判断一个字符窜是否为电话号码
	 * @access public
	 * @static
	 * @param string $value
	 * @return boolean
	 */
	public static function tel ($value)
	{
		return self::pregCheck(
		'^((\(\d{2,3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}(\-\d{1,4})?$', 
		$value);
	}

	/**
	 * 判断一个字符窜是否为移动电话号码
	 * @access public
	 * @static
	 * @param string $value
	 * @return boolean
	 */
	public static function mobile ($value)
	{
		return self::pregCheck(
		'^((\(\d{3}\))|(\d{3}\-))?13[0-9]\d{8}?$|15[89]|18[56789]\d{8}?$', $value);
	}

	/**
	 * 判断一个字符窜是否为QQ号码
	 * @access public
	 * @static
	 * @param string $value
	 * @return boolean
	 */
	public static function qq ($value)
	{
		return self::pregCheck('^[1-9]*[1-9][0-9]*$', $value);
	}

	/**
	 * 判断一个字符窜是否为银行卡号
	 * 该方法是以前一个项目给别人写的。
	 * 但是他们都说有点不准，所以还是慎用。呵呵
	 * @access public
	 * @static
	 * @param string $value
	 * @return boolean
	 */
	public static function cardId ($cardId)
	{
		$length = strlen($cardId);
		if ($length != 13 && $length != 16 && $length != 19)
		{
			return false;
		}
		$lastMember = substr($cardId, - 1, 1);
		$cardId = substr($cardId, 0, - 1);
		$length --;
		$cardId = strrev($cardId);
		$num = $tmpNum = 0;
		for ($i = 0; $i < $length; $i ++)
		{
			$tmpNum = $cardId[$i];
			if ($i % 2 == 0)
			{
				$tmpNum *= 2;
				$tmpNum = (int) ($tmpNum / 10) + $tmpNum % 10;
			}
			$num += $tmpNum;
		}
		$num += $lastMember;
		return $num % 10 == 0 ? true : false;
	}

	/**
	 * 判断一个字符窜是的长度大小是否在控制范围内
	 * @access public
	 * @static
	 * @param string $value 字符串
	 * @param array $m 参数数组 $m[0]为字符串的长度最小值  $m[1]为字符串的长度最大值
	 * @return boolean
	 */
	public static function stringLen ($value, $m)
	{
		$strLen = strlen($value);
		return $strLen >= $m[0] && $strLen < $m[1];
	}

	/**
	 * 判断密码是否有非法字符
	 * @access public
	 * @static
	 * @param string $value
	 * @return boolean
	 */
	public static function isPassWord ($value)
	{
		return preg_match('/[a-z][\\\<>_\?\#\$\*\&;\/\[\]\{\}=\(\)\.\^%,].+?[1-9]/', $value);
	}

	/**
	 * 就是preg_match.因为上面有很多方法使用了正则
	 * 不想每次都想写preg_math.于是有了这个方法
	 * @access private
	 * @static
	 * @param string $preg
	 * @param string $value
	 * @return boolean
	 */
	private static function pregCheck ($preg, $value)
	{
		return preg_match('/' . $preg . '/', $value);
	}
}